package main

import (
	"fmt"
	"os"
	"path"
	"path/filepath"
)

func main() {
	/*
		文件操作：
		1.路径：
			相对路径：relative
				相对于当前工程的路径
			绝对路径：absolute
				"E:\代码文件\笔记.txt"

			.当前路径
			..上一层
		2.创建文件夹，如果文件夹存在，创建失败
			os.MkDir()，创建一层文件夹
			os.MkDirAll()，可以创建多层文件夹

		3.创建文件
			Create 采用模式 0666（任何人都可以读写，不可执行）创建一个名为 name 的文件，如果文件已经存在，会截断它（为空文件）
				os.Create()，创建文件

		4.打开文件：让当前的程序，和指定的文件之间建立一个连接
			os.Open(filename)
			os.OpenFile(filename,mode,perm) //mode: 方式，permission: 权限

		5.关闭文件：程序和文件之间的连接断开
			file.Close()

		6.删除文件或目录：慎用，慎用，再慎用（因为通过代码删除的文件，不会在回收站中）
			os.Remove()，删除文件和空目录
			os.RemoveAll()，删除所有
	*/
	//1.路径
	fileName1 := "E:/代码文件/笔记.txt"
	fileName2 := "喜羊羊.txt"

	//判断是否是绝对路径
	//filepath.IsAbs(fileName) 返回值为 bool
	fmt.Println(filepath.IsAbs(fileName1)) //true
	fmt.Println(filepath.IsAbs(fileName2)) //false

	//获取绝对路径
	//filepath.Abs(fileName) 返回值为 file的绝对路径, error
	fmt.Println(filepath.Abs(fileName1)) //E:\代码文件\笔记.txt <nil>
	fmt.Println(filepath.Abs(fileName2)) //E:\代码文件\GO\src\basic\笔记.txt <nil>

	//获取父目录
	//path.Join(fileName,"..") 返回到 file 之前的目录
	fmt.Println(path.Join(fileName1, ".."))

	//2.创建目录
	//os.Mkdir() 只能够创建一层文件夹
	err := os.Mkdir("E:/代码文件/test", os.ModePerm)
	if err != nil {
		fmt.Println("err:", err)
		return
	}
	fmt.Println("文件夹创建成功。。。")

	//os.MkdirAll() 可以创建多层文件夹
	err1 := os.MkdirAll("E:/代码文件/灰太狼/喜羊羊/最帅啦", os.ModePerm)
	if err1 != nil {
		fmt.Println("err1:", err1)
	}
	fmt.Println("多层文件夹创建成功。。。")

	//3.创建文件
	//Create 采用模式 0666（任何人都可以读写，不可执行）创建一个名为 name 的文件
	//如果文件已经存在，会截断它（为空文件）
	//创建绝对路径的文件
	file1, err2 := os.Create("E:/代码文件/灰太狼/狼堡.txt")
	if err2 != nil {
		fmt.Println("err2:", err2)
		return
	}
	fmt.Println(file1) //&{0xc000004a00}

	//创建相对路径的文件
	file2, err3 := os.Create(fileName2) //创建相对路径的文件，是以当前工程为参照的
	if err3 != nil {
		fmt.Println("err3:", err3)
		return
	}
	fmt.Println(file2)

	//4.打开文件：
	file3, err4 := os.Open(fileName2) //只读的
	if err4 != nil {
		fmt.Println("err4:", err4)
		return
	}
	fmt.Println(file3)

	/*
		第一个参数：文件名称
		第二个参数：文件的打开方式
			O_RDONLY：只读模式(read-only)
			O_WRONLY：只写模式(write-only)
			O_RDWR：读写模式(read-write)
			O_APPEND：追加模式(append)
			O_CREATE：⽂件不存在就创建(create a new file if none exists.)
		第三个参数：文件的权限：文件不存在就创建文件，需要指定权限
	*/
	file4, err5 := os.OpenFile(fileName1, os.O_RDONLY|os.O_WRONLY, os.ModePerm)
	if err5 != nil {
		fmt.Println("err5:", err5)
		return
	}
	fmt.Println(file4)

	//5.关闭文件
	file4.Close()

	//6.删除文件或文件夹
	//删除文件
	err6 := os.Remove("E:/代码文件/GO/src/basic/喜羊羊.txt")
	if err6 != nil {
		fmt.Println("err6:", err6)
		return
	}
	fmt.Println("删除文件成功。。。")

	//删除目录（文件夹）
	err7 := os.RemoveAll("E:/代码文件/test")
	if err7 != nil {
		fmt.Println("err7:", err7)
		return
	}
	fmt.Println("删除目录（文件夹）成功。。。")
}
